package fr.afcepf.al22.projet1.dao.implementation;

import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate4.HibernateTemplate;
import org.springframework.transaction.annotation.Transactional;

import fr.afcepf.al22.projet1.dao.interfaces.IDaoCommande;
import fr.afcepf.al22.projet1.entity.Commande;
import fr.afcepf.al22.projet1.entity.Produit;
import fr.afcepf.al22.projet1.entity.Utilisateur;
@Transactional
public class DaoCommandeImpl implements IDaoCommande {
	private Logger log=Logger.getLogger(this.getClass());
	private HibernateTemplate ht;
		
		public void setSessionFactory(SessionFactory sf){
			ht=new HibernateTemplate(sf);
		}
	@Override
	public Commande ajouterCommande(Commande commande) {
		log.info("Dans DAOCommande ajouterCommande");
		ht.save(commande);
		return commande;
	}

	@Override
	public Commande modifierCommande(Commande commande) {
		log.info("Dans DAOCommande modifierCommande");
		ht.update(commande);
		return commande;
	}

	@Override
	public boolean supprimerCommande(Commande commande) {
		log.info("Dans DAOCommande supprimerCommande");
		ht.delete(commande);
		return true;
	}

	@Override
	public List<Commande> getCommandesByUtilisateur(Utilisateur unUtilisateur) {
		log.info("Dans DAOCommande getCommandesByUtilisateur");
		List<Commande> liste=(List<Commande>) ht.findByNamedParam("SELECT c FROM Commande c WHERE c.utilisateur.idUtilisateur=:idUtilisateur", "idUtilisateur", unUtilisateur.getIdUtilisateur());
		return liste;
	}

	@Override
	public List<Commande> getCommandesByDates(Date dateDebut, Date dateFin) {
		log.info("Dans DAOCommande getCommandesByDates");
		String[] param={"debutPeriode","finPeriode"};
		Date[] tabDates={dateDebut,dateFin};
		List<Commande> liste=(List<Commande>)ht.findByNamedParam("SELECT c FROM Commande c WHERE c.dateCommande BETWEEN debutPeriode AND finPeriode", param, tabDates);
		return liste;
	}

	@Override
	public Commande getCommandeById(Integer id) {
		log.info("Dans DAOCommande getCommandeById");
		List<Commande> liste=(List<Commande>) ht.findByNamedParam("SELECT c FROM Commande c WHERE c.idCommande=:idCommande", "idCommande", id);
		Commande commande=null;
		if(liste.size()==1){
			commande=liste.get(0);
		}
		return commande;
	}

	@Override
	public List<Commande> getCommandeByProduit(Produit produit) {
		log.info("Dans DAOCommande getCommandeByProduit");
		@SuppressWarnings("unchecked")
		List<Commande> liste=(List<Commande>)ht.findByNamedParam("SELECT c FROM Commande c WHERE c.idCommande IN (SELECT lc.commande.idCommande FROM LigneCommande lc WHERE lc.produit.idProduit=:idProduit)", "idProduit", produit.getIdProduit());
		return liste;
	}

}
